package com.tensquare.base.service;

import antlr.StringUtils;
import com.tensquare.base.dao.LabelRepository;
import com.tensquare.base.pojo.Label;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import utils.IdWorker;

import javax.persistence.criteria.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * \标签业务逻辑类
 */
@Service
@Transactional // 添加事务
public class LabelService {
    @Autowired
    private IdWorker idWorker;

    @Autowired
    private LabelRepository labelRepository;

    /**
     * 查询全部标签
     */
    public List<Label> findAll() {
        return this.labelRepository.findAll();
    }

    /**
     * 根据id查询一个标签
     */
    public Label findById(String labelId) {
        return this.labelRepository.findById(labelId).get(); //jpa返回到是Optional对象，是jdk1.8后到新特性,可以通过.get()获取label对象
    }

    /**
     * 保存一个标签
     */
    public void save(Label label) {
        // 添加雪花算法生成到唯一id
        label.setId(this.idWorker.nextId() + "");

        this.labelRepository.save(label);
    }

    /**
     * 更新一个标签
     */
    public void update(Label label) {
        // 直接jpa到save功能即可，底层是查询，有就更新，没有就保存
        this.labelRepository.save(label);
    }

    /**
     * 删除一个标签
     */
    public void delete(String labelId) {
        this.labelRepository.deleteById(labelId);
    }

    /**
     * 根据条件查询列表
     *
     * @param label
     * @return
     */
    public List<Label> findLabelList(Label label) {
        Specification<Label> spec = new Specification<Label>() {
            @Override
            public Predicate toPredicate(Root<Label> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) {
                // 创建集合
                ArrayList<Predicate> andPredicateList = new ArrayList<>();

                // 标签名
                Path<Object> labelName = root.get("labelname");
                // 判断属性是否为空
                if (label.getLabelname() != null && !label.getLabelname().equals("")) {
                    // 不为空
                    andPredicateList.add(criteriaBuilder.like(labelName.as(String.class), "%" + label.getLabelname().toUpperCase() + "%"));
                }
                // 状态
                Path<Object> state = root.get("state");
                // 判断是否为空
                if (label.getState() != null && !label.getState().equals("")) {
                    // 不为空
                    andPredicateList.add(criteriaBuilder.equal(state, label.getState()));
                }

                // 是否推荐
                Path<Object> recommend = root.get("recommend");
                if (label.getRecommend() != null && !"".equals(label.getRecommend())) {
                    andPredicateList.add(criteriaBuilder.equal(recommend, label.getRecommend()));
                }

                // 把集合转数组
                return criteriaBuilder.and(andPredicateList.toArray(new Predicate[andPredicateList.size()]));
            }
        };
        return this.labelRepository.findAll(spec);
    }

    /**
     * 根据条件分页查询
     */
    public Page<Label> pageQuery(Label label, int page, int size){

        Pageable pageable =  PageRequest.of(page-1, size);

        Specification<Label> spec = new Specification<Label>() {
            @Override
            public Predicate toPredicate(Root<Label> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) {
                // 创建集合
                ArrayList<Predicate> andPredicateList = new ArrayList<>();

                // 标签名
                Path<Object> labelName = root.get("labelname");
                // 判断属性是否为空
                if (label.getLabelname() != null && !label.getLabelname().equals("")) {
                    // 不为空
                    andPredicateList.add(criteriaBuilder.like(labelName.as(String.class), "%" + label.getLabelname().toUpperCase() + "%"));
                }
                // 状态
                Path<Object> state = root.get("state");
                // 判断是否为空
                if (label.getState() != null && !label.getState().equals("")) {
                    // 不为空
                    andPredicateList.add(criteriaBuilder.equal(state, label.getState()));
                }

                // 是否推荐
                Path<Object> recommend = root.get("recommend");
                if (label.getRecommend() != null && !"".equals(label.getRecommend())) {
                    andPredicateList.add(criteriaBuilder.equal(recommend, label.getRecommend()));
                }

                // 把集合转数组
                return criteriaBuilder.and(andPredicateList.toArray(new Predicate[andPredicateList.size()]));

            }
        };
        return this.labelRepository.findAll(spec, pageable);
    }
}

